November 8, 2019
Also: If you need to see all the data points at the same time, don’t use animation
Thomas Lin Pedersen’s example from https://gganimate.com - (@thomasp85)
(Be open to the idea that you might not need animation to be most effective)
library(ggplot2) # make plots library(gganimate) # animate the plots library(gifski) # render gifs
Optional, maybe interesting packages
library(transformr) # additional smooth transformations library(patchwork) # arrange multiple plots in a single layout library(ggforce) # extended options for ggplot functionality
Using data on displaced persons living in South Africa, show patterns and trends in refugee movement over twenty-plus years.
Where do most refugees come from?
Is the number of refugees coming from the most common countries of origin stable?
Data Source: UNHCR via data.world: UNHCR’s populations of concern residing in South Africa
Grab dataset of displaced persons living in South Africa
| X_date_year | X_country_residence | X_country_origin | X_population_type | X_affected |
|---|---|---|---|---|
| 1996 | South Africa | Angola | Refugees (incl. refugee-like situations) | 3876 |
| 1996 | South Africa | Angola | Returned refugees | 308 |
| 1996 | South Africa | Bangladesh | Refugees (incl. refugee-like situations) | 452 |
| 1996 | South Africa | China | Refugees (incl. refugee-like situations) | 469 |
Select the top 10 countries of origin for each year, apply some filters.
| X_date_year | X_country_residence | X_country_origin | X_population_type | X_affected | rank |
|---|---|---|---|---|---|
| 1996 | South Africa | Angola | Refugees (incl. refugee-like situations) | 3876 | 1 |
| 1996 | South Africa | Bangladesh | Refugees (incl. refugee-like situations) | 452 | 9 |
| 1996 | South Africa | China | Refugees (incl. refugee-like situations) | 469 | 8 |
| 1996 | South Africa | Dem. Rep. of the Congo | Refugees (incl. refugee-like situations) | 2505 | 3 |
Group by country, bar height is affected persons
baseplot1 <- ggplot(plotDT,
aes(X_date_year,
group = X_country_origin,
fill = as.factor(X_country_origin),
color = as.factor(X_country_origin)))+
theme_bw()+
theme(legend.position = "bottom")+
geom_bar(aes(y = X_affected), stat = "identity", position = "dodge")
Ew. This is not effective.
Let’s make this!
Flip axis, change axes and margins, change grouping, etc.
baseplot3 <- ggplot(plotDT,
aes(x=rank,
group = X_country_origin,
fill = as.factor(X_country_origin),
color = as.factor(X_country_origin)))+
theme_bw()+
theme(legend.position = "none",
axis.ticks.y = element_blank(),
axis.text.y = element_blank(),
axis.title.y = element_blank(),
plot.margin = margin(1,1,1,5, "cm"))+
geom_text(aes(y = 0, label = paste(X_country_origin, " ")), vjust = 0.2, hjust = 1) +
coord_flip(clip = "off", expand = FALSE, ylim = c(0, 50000)) +
geom_bar(aes(y = X_affected), stat = "identity", position = "identity")+
scale_y_continuous(labels = scales::comma) +
scale_x_reverse()
Now we have the different “frames” all layered on top of each other.
Revisit our goals:
Let’s try static options one last time just to be sure.
No.
Definitely not.
Literally add one more line of code to your ggplot object.
animp <- baseplot3 + transition_states(X_date_year)